//
// IUT de Nice / Departement informatique / Module APO Java
// Annee 2011_2012 - DUT/S2T
//
// Classe Region - Himalya
//
// Auteur : T. Cazorla & Y Serre
// V 1.0.0
//
// Description: Elle est constitu�e de villages diff�rent, et est d�finie par un num�ro.			
//
//				La classe Region permet de determiner quel joueur a le plus d'influence
//              politique en fin de partie, suite aux placements des delegations.
//              
//			    Le joueur ayant placer le plus de delegation sur la r�gion remporte
//              son contr�le, gagnant ainsi son influence politique.

import java.util.*;


	/**
	 * Modelisation de la classe Region</br>
	 * une classe Region est compose d'un numero, du nombre de delegation pour chaque caravaniers, le nom du caravanier qui possede la region et d'une liste cha�n�e de villages
	 * @author Yann Seree, Tony Cazorla
	 * @version 1.0.0
	 */
    public class Region {
    	private int m_numero;
    	private String m_posseder;
    	private ArrayList<Village> m_villages;
    	private LinkedHashMap<String, Integer> m_nbDelegation; 
    	

// ---                                             constructeur par default	
//

   /**
    * Constructeur par default</br>
    * 
    */	
    	
    public Region() {		
    	m_nbDelegation = new LinkedHashMap<String, Integer>();		
    	m_numero = 0;		
    	m_villages = new ArrayList<Village>();
    	
    	m_nbDelegation.put("Bleu", new Integer(0));
    	m_nbDelegation.put("Rouge", new Integer(0));
    	m_nbDelegation.put("Vert", new Integer(0));
    	m_nbDelegation.put("Blanc", new Integer(0));
    	m_nbDelegation.put("Jaune", new Integer(0));
    	m_nbDelegation.put("Violet", new Integer(0));
    	m_posseder = "";
    }
    	
// ---                                             Premier constructeur normal
//
    
	/**
	 * Premier constructeur normal (sans delegations)</br>
	 * @param num : le numero du village
	 * @param village : la liste de village comprise dans la region
	 */

	public Region(int num,final ArrayList<Village> village) {
		m_villages = new ArrayList<Village>();
		m_nbDelegation = new LinkedHashMap<String, Integer>();		
		m_numero = num;		
		
		// On copie chaques �l�ments de la liste chain�e pass� en param�tre 
		//
		for (int i=0; i<village.size(); i++) {
			m_villages.add((village.get(i)));
		}

		m_nbDelegation.put("Bleu", new Integer(0));
		m_nbDelegation.put("Rouge", new Integer(0));
		m_nbDelegation.put("Vert", new Integer(0));
		m_nbDelegation.put("Blanc", new Integer(0));
		m_nbDelegation.put("Jaune", new Integer(0));
		m_nbDelegation.put("Violet", new Integer(0));
		
		m_posseder = null;
		
	}
	

// ---                                             Second constructeur normal
//
	
	/**
	 * Deuxieme Constructeur normal a partir</br>
	 * @param num : le numero du village
	 * @param delegation : le nombre de delegations poses par chaque caravaniers dans une region
	 * @param villages : la liste des villages compris dans la region
	 */

	public Region(int num, final ArrayList<Village> village, final LinkedHashMap<String,Integer> delegation ) {
		m_numero = num;
		m_nbDelegation = new LinkedHashMap<String,Integer>();
		m_villages = new ArrayList<Village>();
		
		// On copie chaques �l�ments de la liste chain�e pass� en param�tre 
		//		
		for (int i=0; i<village.size(); i++) {
			m_villages.add((village.get(i)));
		}
		
		// On copie chaques �l�ments du LinkedHashMap pass� en param�tre 
		//		
		m_nbDelegation.putAll(delegation);
		
		// On regarde qui possde le plus de delegation apres la construction si le LinkedHashMap ne possede pas de valeurs null
		//
		setPossede();
	}
		
// ---                                             Accesseur nombre de delegation par caravanier	
//
	
	/**
	 * Accesseur qui retourne le nombre de delegations de chaque caravaniers pose dans le village</br>
	 * @return LinkedHashMap<String, Integer>
	 */
	 
	public LinkedHashMap<String, Integer> getM_nbDelegation() {
		return m_nbDelegation;
	}

//												   Accesseur caravanier possedant la region
//	
	/**
	 * Accesseur qui retourne la couleur du caravanier ayant le plus de delegation, et donc celui qui possede la region</br>
	 * @return String
	 */
	 
	public String getM_posseder() {
		return m_posseder;
	}

	
// ---                                             Accesseur modification nombre de delegation
//
	
	/**
	 * Accesseur qui modifie le nombre de delegations poses dans une region par un caravanier</br>
	 * @param couleur : La couleur du caravanier a modifier
	 * @param nbDelegation : le nouveau nombre de delegation de chaque caravanier
	 */
	 
	public void setM_nbDelegation(String couleur, int nbDelegation) {		
		m_nbDelegation.put(couleur, new Integer(nbDelegation)); // modifiera automatiquement la couleur
		setPossede();	
	}	

//										           Accesseur de modification pour savoir qui possede la r�gion	
//	

	/**
	 * Accesseur qui modifie le nom du caravanier possedant la region</br>
	 */
	 
	public void setPossede(){
		
		// On recupere le nombre de delegation de chaque caravanier
		//
		
		Integer Bleu = m_nbDelegation.get("Bleu");
		Integer Rouge = m_nbDelegation.get("Rouge");
		Integer Vert = m_nbDelegation.get("Vert");
		Integer Blanc = m_nbDelegation.get("Blanc");
		Integer Jaune = m_nbDelegation.get("Jaune");
		Integer Violet = m_nbDelegation.get("Violet");
		
		String possede = "";
		
		// On recherche le caravanier qui a le plus grand nombre de delegation
		//
		
		if(Bleu > Rouge && Bleu > Vert && Bleu > Blanc && Bleu > Jaune && Bleu > Violet){
			possede = "Bleu";
		}
		
		if(Rouge > Bleu && Rouge > Vert && Rouge > Blanc && Rouge > Jaune && Rouge > Violet){
			possede = "Rouge";
		}
		
		if(Vert > Bleu && Vert > Rouge && Vert > Blanc && Vert > Jaune && Vert > Violet){
			possede = "Vert";
		}
		
		if(Blanc > Bleu && Blanc > Rouge && Blanc > Vert && Blanc > Jaune && Blanc > Violet){
			possede = "Blanc";
		}
		
		if(Jaune > Bleu && Jaune > Rouge && Jaune > Vert && Jaune > Blanc && Jaune > Violet){
			possede = "Jaune";
		}
		
		if(Violet > Rouge && Violet > Vert && Violet > Blanc && Violet > Jaune && Violet > Bleu){
			possede = "Violet";
		}	

		m_posseder = possede;
	}

// ---                                             Accesseur du numero de region
//
	
	/**
	 * Accesseur qui retourne le numero d'identification du village</br>
	 * @return int
	 */
	 
	public int getM_numero() {
		return m_numero;
	}

// ---                                             Accesseur villages	
//
	
	/**
	 * Accesseur qui retourne la liste des villages qui sont dans la region</br>
	 * @return ArrayList<Village>
	 */
	 
	public ArrayList<Village> getM_villages() {
		return m_villages;
	}	

// ---                                             Methode toString
//
	
	/** 
	 * Surcharge de toString</br>
	 * Utilise le toString de village
	 * Retourne une chaine de caractere avec le numero du village, le nombre de delegations de chaque caravanier et la liste des villages qui sont dans la region
	 * @return String
	 */
	
	public String toString() {
		return "Region [numero=" + m_numero + ", villages=" + m_villages.toString() + ", Delegation=" + m_nbDelegation + "]";
	}
	

// ---                                             Methode clones
//
	
	/** 
	 * Surcharge de clone</br>
	 * Retourne un clone de l'objet support
	 * @return Objet
	 */
	 
	protected Object clone() {
			
		ArrayList<Village> m_villagesClone = new ArrayList<Village>();
		LinkedHashMap<String, Integer> m_nbDelegationClone = new LinkedHashMap<String, Integer>();
		
		// On copie chaques villages
		//
		for (int i=0; i<m_villages.size(); i++) {
			m_villagesClone.add((Village)(m_villages.get(i)).clone());
		}
		
		// On copie le nombre de delegation des caravaniers
		//
		m_nbDelegationClone.putAll(m_nbDelegation);
		
	   	return new Region(m_numero, m_villagesClone, m_nbDelegationClone);
	}
	
// ---                                             Methode equals	
//
	
	/** Surcharge de equals</br>
	 * Compare deux objets, retourne true s'ils sont egaux
	 * Retourne false si ce n'est pas le cas
	 * @return booleen
	 */	
	
	public boolean equals(Object op2) {
		boolean b1 = true;
		boolean b2 = true;
		
		
		// Comparaison de chaque village des deux regions
		//
		if (this.m_villages.size()==((Region)op2).m_villages.size())
		{for (int i = 0; i<this.m_villages.size(); i++)
			{
				b1 = this.m_villages.get(i).equals(((Region)op2).m_villages.get(i));
					if (b1==false) {
						return false;
						} 
			}			
		}else {
			System.out.println("taille");
			b1 = false;
		}
		
		// Comparaison du nombre de delegation par caravanier de chaque region
		//
		
		if (m_nbDelegation.size()==((Region)op2).m_nbDelegation.size()){					
			  for(String key : m_nbDelegation.keySet()) {
			        if(((Region)op2).m_nbDelegation.containsKey(key)) {
			            if(!m_nbDelegation.get(key).equals(((Region)op2).m_nbDelegation.get(key))) {
			                b2 = false;
			            }
			        } else {
			            b2 =  false;
			        }
			    }
		} else {
			b2 = false;
		}
		return m_numero == ((Region)op2).m_numero && b1 && b2;
	}

	public void main(String args){
		
	}
}
    
    
